其他
严选逆向交易系统建设的思考与实践
什么是逆向交易?逆向交易的业务边界是什么?逆向交易面临的难点和痛点又是什么?很多同学对此表示不解,经常听到针对此类问题的讨论。本文主要是向大家介绍逆向交易系统实践过程中的基本思路和实施策略,以及核心业务流程。
1. 前言
严选在前期发展过程当中,主要受商业环境的影响,业务玩法层出不穷,业务飞速迭代过程中C端交易逆向流程一直是最容易被忽视以及容易出现线上问题的场景,并且在逆向流程日常运维过程中,一直由交易域领域专家跟进处理,消耗着交易域宝贵的研发资源,给用户带来不好体验的同时还消耗着严选客服资源,且存在资损风险。
2. 为什么要建设逆向交易系统
人:下单用户信息,收货人信息
货:所购商品信息,商品履约信息
款:支付信息,促销优惠信息
文档负债:缺乏统一的接口文档,影响开发和运维效率。
代码负债: 重复代码:带来开发维护成本的增加,增量需求改造不完整会导致系统表现不一致等额外风险。 代码耦合度高:业务域之间等存在参数、类和接口高耦合,代码改成成本高,影响面难以评估。 代码复杂度高:条件语句过多,过程控制过于复杂,程序扩展性差。
管理负债:不同的技术团队维护同一份代码,协调成本高,工期很长。
构建逆向交易微服务,降低逆向交易与客服、售后,四端和支付等系统的耦合,简化业务实现复杂度,并且引入接口平台管理逆向交易接口。 抽取所有现金和促销优惠的共性,构建通用的逆向交易能力,简化业务方接入成本,通过流程引擎提升退款审核流程扩展性。
3. 逆向交易系统实践
3.1 建设思路
先把书读厚,再把书读薄:边界治理 首先,把交易逆向业务流程梳理清楚,并且理解透彻实现方式。三个重点抓手:当前业务代码实现、日常线上问题跟踪和向原业务域领域专家请教。目标主要是两方面:了解交易逆向业务复杂度和团队日常协作过程中的痛点。 然后,通过微服务化完成边界治理,抽象逆向交易域能力,提升逆向交易域能力复用程度,简化业务实现复杂度。 寻找最小价值交付单元:需求交付策略 结合当时团队和业务背景:严选业务快速迭代+逆向交易服务化资源不足+服务化对业务影响面必须可控。客观因素不支持一次性完整交付逆向交易项目,并且从历史经验来看一上来就集中多数资源参与的大项目,成本高、压力大,失败的概率更大。在真正的竞争压力面前,拆分逆向交易域最小价值交付单元,进行阶段性价值交付,优先交付高价值单元是最优选择。
上图中,展示了逆向交易项目交付的5个阶段,交付路径背后的考量主要有以下四点:
独立交付,逆向交易域拆分的各个阶段都能独立交付。
交付内容依赖关系,逆向交易域中“退款能力”属于基础能力,必须优先交付。
交付的成本和节奏,技术重构项目建议的交付周期是两周到一个月之间,如果交付过于频繁会打乱研发节奏,交付时间太长则会导致积攒很高的风险。
把握技术重构与业务需求之间的平衡,技术重构不能影响日常业务价值交付。
3.2 架构设计
建模阶段通过事件风暴完成设计从0到1:召集业务团队、产品团队、技术团队对领域信息和领域边界达成一致,统一语言,输出领域模型,通过抽象、封装和多态等设计要素,提升代码的复用程度,降低系统的业务复杂度。 确定“退款能力”、“退款查询”、“退款计算”、“订单取消”和“包裹取消”等领域能力; 构建“审核通过”、“退款成功”和“退款失败”等领域事件。
实施阶段采用经典的四层架构设计:在划分的业务边界内持续演进。
十大主流应用场景
3.3 核心流程设计
3.3.1 退款审批流程 :扩展性设计
售后场景由客服判定直接发起的退款流程,退款金额人工录入,审批环节能明显降低误操作概率; 新产品逆向交易流程接入,审批流程必不可少; 逆向业务流程中核心系统进行服务化或者涉及退款金额模型调整,审批环节需要特别留意。
开源免费;
逆向退款单的创建和执行解耦,不存在高并发场景,Activiti经过优化完全能够满足;
具备Activiti使用和优化经验,为逆向交易快速接入奠定基础;
Activiti中节点定义粒度较粗,复杂流程中存在由理解不同造成节点定义粒度不一致等情况,但是审批流程节点定义比较明确,由不同的审批节点组合而成;
图形化编辑(如下图所示),流程数据和业务数据分离。
3.3.2 退款处理流程:降低复杂业务实现复杂度
从产品形态来看,严选主站逆向交易流程中现金和促销优惠逆向规则应该保持一致,否则用户会产生困惑;理论上不存在差异化的编排诉求,不做过度设计;
为什么又把补偿退款流程单独拎出来呢?那是从业务形态上出发的,赔付和其他逆向交易流程存在着天然的差异性,赔付流程仅涉及单类现金或促销优惠的退还,不需要关联商品或者订单下单过程中使用的现金或促销优惠;
从实现成本来看,进行节点拆分并且由Activiti统一编排和管控的模式,工作量会是当前实现方式的两倍以上,加上当时资源不足和工期压缩的背景,不做Activiti统一编排和管控是最优解。
“退款执行”流程
“补偿退款执行”流程
“退款执行”对应的是常规退款流程,例如:取消订单、取消包裹、售后退货退款等场景触发的退款;
“补偿退款执行”则是对应非常规退款流程,例如:价保和售后赔付等场景触发的退款。
3.3.3 最大可退金额模型 :资损兜底策略
3.3.4 特殊退款流程:适配正向交易订单模型
退款处理流程中,除了编排现金和促销优惠的逆向操作,还需要适配正向交易订单模型,比如:换货订单=多笔订单记录+单笔支付记录,定金购订单=单笔订单记录+多笔支付记录。
换货单退款流程
定金购订单退款流程
定金购订单:定金订单和尾款订单都会使用现金和促销优惠,针对尾款订单发起逆向流程(比如:取消订单),需要对定金订单和尾款订单使用的现金和促销优惠都执行逆向操作,涉及多笔支付订单。
换货订单:只有原始订单关联资现金和促销优惠,针对换货后订单发起逆向流程,需要定位到原始订单,然后对原始订单使用的现金和促销优惠执行逆向操作。
4. 小结
本文重点介绍了逆向交易的核心流程和背后的设计思路,相信能坚持看完的同学对严选逆向交易有了一定的了解,如果想了解很多内容或者细节,欢迎在文章后面留言。
截止目前,逆向交易已完成退款能力、订单取消和包裹取消的建设,相比建设之前逆向交易域线上运维投入减少80%以上,新需求接入成本降低50%以上。后续我们将持续完成退款查询和退款计算能力的建设,进一步提升业务对接和运维效率,让我们有更多的时间去思考业务和技术,为用户创造更多的价值。